﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using vudu.Presentacion.Contrato.VU_14_Registrarse_en_el_Sistema;
using vudu.Logica.Fachada;
using vudu.ClasesDominio;
using System.Text.RegularExpressions;

namespace vudu.Presentacion.Presentador.VU_14_Registrarse_en_el_Sistema
{
    public class PresentadorRegistroSistema
    {
        private IContratoRegistroSistema _vista;
        private EnlaceLogico _fachada;
        #region Variables y constantes;
        private System.Drawing.Color _colorMensajeError = System.Drawing.Color.Red;
        private System.Drawing.Color _colorMensajeExitoso = System.Drawing.Color.Green;
        private System.Drawing.Color _colorLabelBase = System.Drawing.Color.Black;
        private int _longMinCorreo = 3;
        private int _longMaxCorreo = 38;
        private int _longMinCedula = 7;
        private int _longMaxCedula = 8;
        private int _longMinPass = 6;
        private int _longMaxPass = 20;
        private int num = 0;
        int _opcion = 0;
        private string correoUni = "@univ.vudu.com";
        private string correoEsc = "@esc.vudu.com";
        private string correoEst = "@est.vudu.com";
        private string correoProf = "@prof.vudu.com";
        private string transaccionFallida = "transaccionFallida";
        private string operacionFallida = "Operación Fallida: Datos Incorrectos";
        private string siEsSeleccion = "0";
        private string siEsUniversidad = "1";
        private string usuarioUniversidad = "Universidad";
        private string siEsEscuela = "2";
        private string usuarioEscuela = "Escuela";
        private string siEsEstudiante = "3";
        private string usuarioEstudiante = "Estudiante";
        private string siEsProfesor = "4";
        private string usuarioProfesor = "Profesor";
        private string operacionFallidaCorreo = "Operación Fallida: El correo ya es utilizado";
        private string transaccionExitosa = "transaccionExitosa";
        private string registroSistema = "Registro Sistema";
        private string registroUniversidad = "Registro Universidad";
        private string registroEscuela = "Registro Escuela";
        private string registroEstudiante = "Registro Estudiante";
        private string registroProfesor = "Registro Profesor";
        private string seleccioneUniversidad = "Seleccione Universidad";
        private string seleccioneCedula = "Cedula de Identidad";
        #endregion

        public PresentadorRegistroSistema(IContratoRegistroSistema vista)
        {
            _vista = vista;
            _fachada = new EnlaceLogico();
        }

        public void VaciarCampos()
        {
            _vista.cedula.Text = _vista.usuario.Text = _vista.password.Text = "";
            _vista.listaUniversidad.DataSource = null;
           
        }

        public void VaciarCamposError()
        {
            _vista.mensajeNombreUsuario.ForeColor = _colorLabelBase;
            _vista.asterisco2Informacion.ForeColor = _colorLabelBase;
            _vista.asterisco3Informacion.ForeColor = _colorLabelBase;
            _vista.mensajeInformacionUsuario.Visible = false;
            _vista.mensajeInformacionUsuario.Text = "";
        }

        /// <summary>
        /// Funcion que valida si los campos del formulario son correctos.
        /// </summary>
        /// <param name="numero"></param>
        /// <returns>retorna true si es, false caso contrario.</returns>
        public bool ValidarCampos()
        {
            bool val1 = true;
            bool val2 = true;
            bool val3 = true;
            bool val4 = true;
            val1 = this.ValidarCedula(_vista.cedula.Text);
            val2 = this.ValidarCorreo(_vista.usuario.Text);
            val3 = this.ValidarPassword(_vista.password.Text);
            if (_vista.cedula.Text == "")  /// Valida si el campo de la cedula es vacio
            {                
                _vista.mensajeNombreUsuario.ForeColor = _colorMensajeError;
                val4 = false;
            }
            if (_vista.usuario.Text == "")    /// Valida si el campo del mail es vacio
            {
                _vista.asterisco2Informacion.ForeColor = _colorMensajeError;
                val4 = false;
            }
            if (_vista.password.Text == "")    /// Valida si el campo del password es vacio
            {
                _vista.asterisco3Informacion.ForeColor = _colorMensajeError;
                val4 = false;
            }
            if ((val1 == true) && (val2 == true) && (val3 == true) && (val4 == true))
            {
                _vista.avisotransaccion.Text = operacionFallida;
                _vista.avisotransaccion.CssClass = transaccionFallida;
                _vista.avisotransaccion.Visible = true;


                return true;
            }
            else
                return false;
        }

        /// <summary>
        /// Funcion que valida si el campo del formulario de registro universidad o escuela son correctos.
        /// </summary>
        /// <param name="numero"></param>
        /// <returns>retorna true si es, false caso contrario.</returns>
        public bool ValidarCamposUniEscuela()
        {
            bool val2 = true;
            bool val3 = true;
            bool val4 = true;
            val2 = this.ValidarCorreo(_vista.usuario.Text);
            val3 = this.ValidarPassword(_vista.password.Text);

            if (_vista.usuario.Text == "")    /// Valida si el campo del mail es vacio
            {
                _vista.asterisco2Informacion.ForeColor = _colorMensajeError;
                val4 = false;
            }
            if (_vista.password.Text == "")    /// Valida si el campo del password es vacio
            {
                _vista.asterisco3Informacion.ForeColor = _colorMensajeError;
                val4 = false;
            }
            if ((val2 == true) && (val3 == true) && (val4 == true))
            {
                _vista.avisotransaccion.Text = operacionFallida;
                _vista.avisotransaccion.CssClass = transaccionFallida;
                _vista.avisotransaccion.Visible = true;
                return true;
            }
            else
                return false;
        }


        /// <summary>
        /// Funcion que valida si el campo de la cedula es ta en su formato correcto.
        /// </summary>
        /// <param name="numero"></param>
        /// <returns>retorna true si es, false caso contrario.</returns>
        public bool ValidarCedula(string ci)
        {
            bool esValido = false;
            esValido = int.TryParse(ci, out num);
            if (!esValido)  /// solo numeros
            {
                _vista.avisotransaccion.Text = operacionFallida;
                _vista.avisotransaccion.CssClass = transaccionFallida;
                _vista.avisotransaccion.Visible = true;
                _vista.mensajeNombreUsuario.ForeColor = _colorMensajeError;
                return false;
            }
            else if ((ci.Length < _longMinCedula) || (ci.Length > _longMaxCedula))  /// mayor que 7 y menor que 8
            {
                _vista.avisotransaccion.Text = operacionFallida;
                _vista.avisotransaccion.CssClass = transaccionFallida;
                _vista.avisotransaccion.Visible = true;
                _vista.mensajeNombreUsuario.ForeColor = _colorMensajeError;
                return false;
            }
            else
            {
                return true;
            }
        }

        /// <summary>
        /// Funcion que valida que el correo este en su formato correcto.
        /// </summary>
        /// <param name="numero"></param>
        /// <returns>retorna true si es, false caso contrario.</returns>
        public bool ValidarCorreo(string correo)
        {
            Regex regex = new Regex(@"\W");
            Regex rege = new Regex(@"\s");


            if ((rege.IsMatch(correo)) || (regex.IsMatch(correo)))  /// valida que no tenga caracteres especiales
            {
                _vista.avisotransaccion.Text = operacionFallida;
                _vista.avisotransaccion.CssClass = transaccionFallida;
                _vista.avisotransaccion.Visible = true;
                _vista.asterisco2Informacion.ForeColor = _colorMensajeError;
                return false;
            }
            else if ((correo.Length < _longMinCorreo) || (correo.Length > _longMaxCorreo))  /// mayor que 3 y menor que 38
            {
                _vista.avisotransaccion.Text = operacionFallida;
                _vista.avisotransaccion.CssClass = transaccionFallida;
                _vista.avisotransaccion.Visible = true;
                _vista.asterisco2Informacion.ForeColor = _colorMensajeError;
                return false;
            }
            else
            {
                return true;
            }
        }


        /// <summary> 
        /// Funcion que valida que la clave no sea menor que 6 y mayor que 20 caracteres.
        /// </summary>
        /// <param name="numero"></param>
        /// <returns>retorna true si es, false caso contrario.</returns>
        public bool ValidarPassword(string pass)
        {
            if ((pass.Length < _longMinPass) || (pass.Length > _longMaxPass))
            {
                _vista.avisotransaccion.Text = operacionFallida;
                _vista.avisotransaccion.CssClass = transaccionFallida;
                _vista.avisotransaccion.Visible = true;
                _vista.asterisco3Informacion.ForeColor = _colorMensajeError;
                return false;
            }
            else
            {
                return true;
            }
        }

        public void ActivarCamposLabel(bool resultado)
        {
            _vista.correoUsuario.Visible = resultado;
            _vista.asterisco1.Visible = resultado;
            _vista.mensajeNombreUsuario.Visible = resultado;
            _vista.asterisco2.Visible = resultado;
            _vista.asterisco2Informacion.Visible = resultado;
            _vista.usuario.Visible = resultado;
            _vista.asterisco3.Visible = resultado;
            _vista.asterisco3Informacion.Visible = resultado;
            _vista.password.Visible = resultado;
        }
           

        /// <summary>
        /// Procedimiento que inicializa la pantalla del sistema.
        /// </summary>
        public void InicioPantalla()
        {
            _vista.mensajePrincipal.Text = registroSistema;
            this.ActivarCamposLabel(false);
            _vista.listaUniversidad.Visible = false;
            _vista.cedula.Visible = false;
            _vista.password.Visible = false;
            _vista.universidadesListaPrincipal.Visible = false;

            _vista.errorObligatorio1.Visible = false;
            _vista.errorObligatorio2.Visible = false;
            _vista.errorObligatorio3.Visible = false;

            _vista.nacionalidad.Visible = false;
            _vista.asterisco4.Visible = false;
            _vista.asterisco4Escuela.Visible = false;
            _vista.listaEscuela.Visible = false;
            

        }

        /// <summary>
        /// Procedimiento que refresca la pantalla dependiendo del tipo de usuario que se seleccione.
        /// </summary>
        public void SeleccionUsuarioRol()
        {
            String opcion = _vista.opcion.SelectedValue;
            _vista.universidadesListaPrincipal.Items.Clear();
            _vista.listaUniversidad.Items.Clear();
            _vista.avisotransaccion.Visible = false;
            _vista.avisotransaccion.Text = "";
            this.VaciarCampos();
            this.VaciarCamposError();
            
            if (opcion.Equals(siEsSeleccion))
            {
                _vista.mensajePrincipal.Text = registroSistema;
                this.InicioPantalla();
               
            }
            if (opcion.Equals(siEsUniversidad))
            {
                this.ActivarCamposLabel(true);
                _vista.mensajeNombreUsuario.Text = seleccioneUniversidad;
                _vista.universidadesListaPrincipal.Visible = true;
                _vista.correoUsuario.Text = correoUni;
                _vista.mensajePrincipal.Text = registroUniversidad;
                
                _vista.cedula.Visible = false;
                _vista.nacionalidad.Visible = false;
                _vista.listaUniversidad.Visible = false;
                _vista.asterisco4.Visible = false;
                _vista.asterisco4Escuela.Visible = false;
                _vista.listaEscuela.Visible = false;
                this.LlenarListaUniversidad();
            }
            if (opcion.Equals(siEsEscuela))
            {
                this.ActivarCamposLabel(true);
                _vista.mensajeNombreUsuario.Text = seleccioneUniversidad;
                _vista.listaUniversidad.Visible = true;
                _vista.correoUsuario.Text = correoEsc;
                _vista.mensajePrincipal.Text = registroEscuela;
                _vista.universidadesListaPrincipal.Visible = false;

                _vista.cedula.Visible = false;
                _vista.nacionalidad.Visible = false;
                _vista.asterisco4.Visible = true;
                _vista.asterisco4Escuela.Visible = true;
                _vista.listaEscuela.Visible = true;
                this.LlenarListaUniversidadesActivas();
            }
            if (opcion.Equals(siEsEstudiante))
            {
                this.ActivarCamposLabel(true);
                _vista.mensajeNombreUsuario.Text = seleccioneCedula;
                _vista.nacionalidad.Visible = true;
                _vista.password.Visible = true;
                _vista.cedula.Visible = true;
                _vista.correoUsuario.Text = correoEst;
                _vista.mensajePrincipal.Text = registroEstudiante;
                _vista.universidadesListaPrincipal.Visible = false;
                _vista.asterisco4.Visible = false;
                _vista.asterisco4Escuela.Visible = false;
                _vista.listaEscuela.Visible = false;
                _vista.listaUniversidad.Visible = false;
               
            }
            if (opcion.Equals(siEsProfesor))
            {
                this.ActivarCamposLabel(true);
                _vista.mensajeNombreUsuario.Text = seleccioneCedula;
                _vista.nacionalidad.Visible = true;
                _vista.cedula.Visible = true;
                _vista.correoUsuario.Text = correoProf;
                _vista.mensajePrincipal.Text = registroProfesor;
                _vista.universidadesListaPrincipal.Visible = false;
                _vista.asterisco4.Visible = false;
                _vista.asterisco4Escuela.Visible = false;
                _vista.listaEscuela.Visible = false;
                _vista.listaUniversidad.Visible = false;
                
            }
        }

        /// <summary>
        /// Procedimiento que llena un DropDownlist con universidades.
        /// </summary>
        public void LlenarListaUniversidad()
        {
            EnlaceLogico miEnlace = new EnlaceLogico();
            List<Universidad> unis = miEnlace.ConsultarUniversidades();
            if (unis.Count > 0)
            {
                for (int i = 0; i < unis.Count; i++) 
                {
                    _vista.universidadesListaPrincipal.Items.Add(new ListItem(unis[i].Nombre.ToString(), unis[i].IdUniv.ToString()));
                    
                }
            }
            else
            {
                _vista.asterisco1.Visible = false;
                _vista.mensajeNombreUsuario.Visible = false;
                _vista.asterisco2.Visible = false;
                _vista.asterisco2Informacion.Visible = false;
                _vista.usuario.Visible = false;
                _vista.correoUsuario.Visible = false;
                _vista.asterisco3.Visible = false;
                _vista.asterisco3Informacion.Visible = false;
                _vista.password.Visible = false;
                _vista.listaUniversidad.Visible = false;
                _vista.mensajeInformacionUsuario.Visible = true;
                _vista.mensajeInformacionUsuario.Text = "No hay universidades para registrar";
                _vista.universidadesListaPrincipal.Visible = false;
      
            }
      
        }

        /// <summary>
        /// Procedimiento que llena un dropdownlist con universidades que se encuentren registradas.
        /// </summary>
        public void LlenarListaUniversidadesActivas()
        {
           
            
            EnlaceLogico miEnlace = new EnlaceLogico();
            List<Universidad> unis = miEnlace.ConsultarUniversidadesActivas();
            _vista.listaUniversidad.Items.Add(new ListItem("--Seleccione--", "0"));
            if(unis.Count > 0)
            {
                for (int i = 0; i < unis.Count; i++) 
                {
                    _vista.listaUniversidad.Items.Add(new ListItem(unis[i].Nombre.ToString(), unis[i].IdUniv.ToString()));
                    
                }
            }
            else
            {
                _vista.asterisco1.Visible = false;
                _vista.mensajeNombreUsuario.Visible = false;
                _vista.asterisco2.Visible = false;
                _vista.asterisco2Informacion.Visible = false;
                _vista.usuario.Visible = false;
                _vista.correoUsuario.Visible = false;
                _vista.asterisco3.Visible = false;
                _vista.asterisco3Informacion.Visible = false;
                _vista.password.Visible = false;
                _vista.listaUniversidad.Visible = false;
                _vista.mensajeInformacionUsuario.Visible = true;
                _vista.mensajeInformacionUsuario.Text = "No hay escuelas nuevas en el Sistema o no hay cuentas de Universidad Activas";
      
            }
        }

        /// <summary>
        /// Procedimiento que llena un dropdownlist de escuelas que posea una universidad activa.
        /// </summary>
        public void LlenarListaEscuela()
        {
            _vista.listaEscuela.Items.Clear();
            this.activarCampos();
            EnlaceLogico miEnlace = new EnlaceLogico();
            int idUniversidad = int.Parse(_vista.listaUniversidad.SelectedValue);

            List<Escuela> escuela = miEnlace.ConsultarEscuelasCombo(idUniversidad);
            if (escuela.Count > 0)
            {
                for (int i = 0; i < escuela.Count; i++) 
                {

                    //ListItem oItem = new ListItem("Juan Valdes", "1");
                    _vista.listaEscuela.Items.Add(new ListItem(escuela[i].NombreEscuela.ToString(), escuela[i].IdEscuela.ToString()));



                }
            }
            else
            {
                _vista.asterisco4.Visible = false;
                _vista.asterisco4Escuela.Visible = false;
                _vista.listaEscuela.Visible = false;
                _vista.asterisco2.Visible = false;
                _vista.asterisco2Informacion.Visible = false;
                _vista.usuario.Visible = false;
                _vista.asterisco3.Visible = false;
                _vista.asterisco3Informacion.Visible = false;
                _vista.password.Visible = false;
                _vista.correoUsuario.Visible = false;
                _vista.mensajeInformacionUsuario.Visible = true;
                _vista.mensajeInformacionUsuario.Text = "Esta Universidad no tiene Escuelas Inactivas";

            }

        }

        /// <summary>
        /// Procedimiento que activa label del sistema.
        /// </summary>
        public void activarCampos()
        {
            _vista.asterisco4.Visible = true;
            _vista.asterisco4Escuela.Visible = true;
            _vista.listaEscuela.Visible = true;
            _vista.asterisco2.Visible = true;
            _vista.asterisco2Informacion.Visible = true;
            _vista.usuario.Visible = true;
            _vista.asterisco3.Visible = true;
            _vista.asterisco3Informacion.Visible = true;
            _vista.password.Visible = true;
            _vista.correoUsuario.Visible = true;
            _vista.mensajeInformacionUsuario.Visible = false;
            _vista.mensajeInformacionUsuario.Text = "";
        }


        /// <summary>
        /// Procedimiento donde se realiza el registro del usuario en el sistema.
        /// </summary>
        public void RegistrarUsuarioEnSistema()
        {
            String opcion = _vista.opcion.SelectedValue;
            _vista.asterisco2Informacion.ForeColor = _colorLabelBase;
            _vista.asterisco3Informacion.ForeColor = _colorLabelBase;
            _vista.mensajeNombreUsuario.ForeColor = _colorLabelBase;
            int usuario = int.Parse(opcion);
            if ((opcion.Equals(siEsUniversidad)) && (this.ValidarCamposUniEscuela() == true))
            {
                _opcion = int.Parse(_vista.universidadesListaPrincipal.SelectedValue);
                this.realizarRegistro(usuarioUniversidad,usuario,_opcion);
                this.VaciarCampos();
                _vista.universidadesListaPrincipal.Items.Clear();
                this.LlenarListaUniversidad();
                

            }
            if ((opcion.Equals(siEsEscuela)) && (this.ValidarCamposUniEscuela() == true))
            {
                _opcion = int.Parse(_vista.listaEscuela.SelectedValue);
                this.realizarRegistro(usuarioEscuela, usuario,_opcion);
                this.VaciarCampos();
                _vista.listaEscuela.Items.Clear();
                this.LlenarListaEscuela();
               

            }
            if ((opcion.Equals(siEsEstudiante)) && (this.ValidarCampos() == true))
            {
                this.RealizarRegistro2(usuarioEstudiante,usuario);
                this.VaciarCampos();

            }
            if ((opcion.Equals(siEsProfesor)) && (this.ValidarCampos() == true))
            {
                this.RealizarRegistro2(usuarioProfesor, usuario);
                this.VaciarCampos();

            }
        }

        /// <summary>
        /// Procedimiento que realiza el registro de una Universidad o Escuela.
        /// </summary>
        public void realizarRegistro(string usuario,int rol,int opcion)
        {


            string correo; string clave;

            

            correo = _vista.usuario.Text + _vista.correoUsuario.Text;
            clave = _vista.password.Text;


            if ( _fachada.verificarCorreoUsuarioRol(correo,rol) == true)
            {
                _vista.avisotransaccion.Text = operacionFallidaCorreo;
                _vista.avisotransaccion.CssClass = transaccionFallida;
                _vista.avisotransaccion.Visible = true;
            }
            else
            {

                _fachada.RegistrarRolenSistema(correo, clave, rol,opcion);
                _vista.avisotransaccion.Text = "La " + usuario + " se registro con éxito";
                _vista.avisotransaccion.CssClass = transaccionExitosa;
                _vista.avisotransaccion.Visible = true;
                _vista.asterisco3Informacion.ForeColor = _colorLabelBase;
                _vista.asterisco2Informacion.ForeColor = _colorLabelBase;
                


            }


        }

        /// <summary>
        /// Procedimiento que realiza el registro de un Estudiante o Profesor.
        /// </summary>
        public void RealizarRegistro2(string usuario, int rol)
        {
            bool val1 = true;
            bool val2 = true;
            bool val3 = true;
            string correo; string clave;
            int cedula = int.Parse(_vista.cedula.Text.ToString());
            string nacionalidad = _vista.nacionalidad.SelectedValue;
               

            correo = _vista.usuario.Text + _vista.correoUsuario.Text;
            clave = _vista.password.Text;

            if (_fachada.verificarCedulaUsuarioRol(nacionalidad,cedula,rol) == false)
            {
                _vista.avisotransaccion.Text = "Operación Fallida: El " + usuario + " no existe";
                _vista.avisotransaccion.CssClass = transaccionFallida;
                _vista.avisotransaccion.Visible = true;
                val1 = false;
            }
            if (_fachada.verificarCorreoUsuarioRol(correo,rol) == true)
            {
                _vista.avisotransaccion.Text = operacionFallidaCorreo;
                _vista.avisotransaccion.CssClass = transaccionFallida;
                _vista.avisotransaccion.Visible = true;
                val2 = false;
            }
            if (_fachada.verificarUsuarioRol(cedula,rol) == true)
            {
                _vista.avisotransaccion.Text = "Operación Fallida: El " + usuario + " ya esta registrado";
                _vista.avisotransaccion.CssClass = transaccionFallida;
                _vista.avisotransaccion.Visible = true;
                val3 = false;
            }
            if ((val1 == true) && (val2 == true) && (val3 == true))
            {
                
                _fachada.RegistrarRolenSistema(correo, clave, rol, cedula);
                _vista.avisotransaccion.Text = "El " + usuario + " se registro con éxito";
                _vista.avisotransaccion.CssClass = transaccionExitosa;
                _vista.avisotransaccion.Visible = true;
                _vista.asterisco3Informacion.ForeColor = _colorLabelBase;
                _vista.asterisco2Informacion.ForeColor = _colorLabelBase;
            }


        }

    }
}